2017-05-26 12 views
0

を照会私は、これはすでに以前に議論されてきた、と私は慎重に読み、それらのすべてをしようとしているが、すべてのソリューションはしばらくI明示リストを返さ知っていますすでに実装されている非同期ページングメソッドにフィードするためにIQueryableを返す必要があります。エンティティまたは複合型「XYZ」はエンティティへのLINQで構築することはできませんが、

ASP NET MVC5 Webアプリケーション、EF6、任意のカテゴリの翻訳を意味し、次のクエリはp.Category.CategoryTransでALL CategoryTransを返す2015

enter image description here

public partial class Product 
    { 
     public int? ID { get; set; } 
     public string Name { get; set; } 
     public string Description { get; set; } 
     public int CategoryID { get; set; } 
     public virtual Category Category { get; set; } 
     public virtual CategoryTrans CategoryTrans { get; set; } 
    } 

public partial class Category 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public int? ParentID { get; set; } 
    public bool IsDeleted { get; set; } 
    public virtual ICollection<Product> Products { get; set; } 
    public virtual ICollection<CategoryTrans> CategoryTrans { get; set; } 
} 

public class ISO_Languages 
{ 
    public int ID { get; set; } 
    public string code { get; set; } 
    public bool IsEnabled { get; set; } 
    public string name_en { get; set; } 
    public string name_fr { get; set; } 
    public string name_it { get; set; } 
    public string name_de { get; set; } 
    public string name_es { get; set; } 
} 

public class CategoryTrans 
{ 
    [Key, Column(Order = 1)] 
    public int category_id { get; set; } 
    [Key, Column(Order = 2)] 
    public int language_id { get; set; } 
    [ForeignKey("category_id")] 
    public virtual Category categoryId { get; set; } 
    [ForeignKey("language_id")] 
    public virtual ISO_Languages languageId { get; set; } 
    public string name { get; set; } 
} 

Visual Studioは、(それが出発点だ しかし、私が必要とするものではありません):

public static IQueryable<Product> ActiveProductsPerUser(BaseContext db,  string userid, string culture) 
{ 
    var query = (from p in db.Products 
       join ct in db.CategoryTrans 
       on p.CategoryID equals ct.category_id 
       join l in db.ISO_Languages 
       on ct.language_id equals l.ID 
       where l.code.Substring(0, 2) == culture 
       select p); 

    return query; 
} 

私がしようとしていることは、すべての製品について、単一のカテゴリtranslatio n、カルチャー入力パラメーターに依存します。

public static IQueryable<Product> ActiveProductsPerUser(BaseContext db, string userid, string culture) 
    { 
     var query = from p in db.Products 
        join ct in db.CategoryTrans 
        on p.CategoryID equals ct.category_id 
        join l in db.ISO_Languages 
        on ct.language_id equals l.ID 
        where l.code.Substring(0, 2) == culture 
        select new Product 
        { 
         ID = p.ID, 
         Name = p.Name, 
         Description = p.Description, 
         CategoryTrans = p.Category.CategoryTrans.Where(b => b.language_id.Equals(l.ID)).SingleOrDefault() 
        }; 
     return query; 
    } 

が、エラーを返す:ような何か

The entity or complex type 'xyz.DAL.Product' cannot be constructed in a LINQ to Entities query.

は、私はいくつかの選択肢を試してみましたが、どれも働きました。

public async Task<ActionResult> UserList(int? page, int sortBy = 1) 
    { 
     int currentPage = (page ?? 1); 
     ViewBag.CurrentPage = currentPage; 
     viewModel.productList = await userlist(sortBy).ReturnPages(currentPage, Constants.PageItems); 
     return View(viewModel);} 

待望:私は間違いなく、ソート、ページング&用担当で、次の非同期メソッドに製品のIQueryableを返す必要があるとして、必要なものをLINQのオブジェクトになく、実体がある代わりに、エンティティへのLINQを返すという問題を理解します"userlist"入力は実装しようとしているメソッドで返されるProduct IQueryableです。

+0

https://stackoverflow.com/questions/5325797/the-entity-cannot-be-constructed-in-a-linq-to-entities-query – levent

+0

レベント、より慎重に私の記事を読んでくれてありがとう。私はその投稿を読んで、解決策がリストを返すことを提案しました。それは私が必要とするものではありません。 – Luke

+0

OK sory .. l.code.Substring(0、2)== culture'と 'B => b.language_id.Equals(l.ID)' 'の違いは何ですか? – levent

答えて

0

私は

The entity or complex type 'xyz.DAL.Product' cannot be constructed in a LINQ to Entities query.

エラーに対する答えを見つけることができませんでした。私は最終的には完全にローカライズされた製品の新しいリストを返し、2つの入れ子foreach文を設定し、ローカライズされたカテゴリ名を表示し、ビューモデルにフィルタリングを移動するための担当で、

[NotMapped] 
public virtual string LocalizedCategoryName { get; set; } 

製品のモデルクラスを追加することで問題を解決しました:

private List<Product> _LocalizedProductList = new List<Product>(); 

public List<Product> LocalizedProductList 
    { 
     get 
     { 
      HttpUtilities HttpHelper = new HttpUtilities(); 
      string culture = HttpHelper.getFullCulture(); 
      int IsoCode = GenericUtilities.getIsoID(culture, db); 
      List<Product> localized = new List<Product>(); 

      foreach (Product p in _LocalizedProductList) 
      { 
       foreach (CategoryTrans c in p.Category.CategoryTrans) 
       { 
        if (c.language_id.Equals(IsoCode)) 
        { 
         Product x = new Product 
         { 
          ID = p.ID, 
          LocalizedCategoryName = c.name, 
          DateCreated = p.DateCreated, 
          DateExpire = p.DateExpire, 
          DateLastModified = p.DateLastModified, 
          Name = p.Name, 
          Description = p.Description, 
          IsApproved = p.IsApproved, 
          IsDeleted = p.IsDeleted, 
          ProductImages = p.ProductImages, 
          User = p.User 
         }; 
         localized.Add(x); 
        }; 
       } 
      } 
      return localized; 
     } 

     set { _LocalizedProductList = value; } 
    } 

これが最善の方法か、唯一の方法であるかはわかりませんが、意図したとおりに動作します。 私は単純なクエリを使い、返されたIQueryableをsortingとpaging asyncメソッドなどに渡すことができます。私が完了すると、結果はViewModel.LocalizedProductListに割り当てられます。ここで、ゲッターは最終的なフィルタリングを行います。

0

私はこの種のものは、より適切であろうと思います。

var query = db.Products 
      .Where(p => p.CategoryTrans.languageId.code.StartWith(culture)) 
      .Include(p => p.CategoryTrans.languageId); 
関連する問題