1

この質問と同様の問題があります:linq質問:ネストされたコレクションのクエリ

が付いた製品があり、ICollection<Category>IDでカテゴリを取得したいと思います。私はすべてIProductsRepositoryを介して。

私は両方products.SelectMany(p => p.Categories).Where(c => c.CategoryID == categoryId)を試しましたが、products.SelectMany(p => p.Categories).First(c => c.CategoryID == categoryId)自分で試した他の多くのバリエーションも試しました。しかし、私はそれを機能させていません。

実行時にInvalidCastExceptionが発生します。Category.CategoryIDとcategoryIdはどちらもintです。

ICategoriesRepositoryを作成する方が良いでしょうか?おそらく、パフォーマンス上の利点もありますか?私は明らかにLINQを初めて使用するので、適切に処理する方法がわかりません。

編集(コードサンプル):

public interface IProductsRepository
{
    IQueryable<Product> Products { get; }
}

public class ProductsController : Controller
{
    public int PageSize = 4;
    private IProductsRepository productsRepository;

    public ProductsController(IProductsRepository productsRepository)
    {
        this.productsRepository = productsRepository;
    }

    public ViewResult ListById(int categoryId, int page = 1)
    {
        Category cat;
        // What do I need here to get the Category with the categoryId regardless of which Product it is connected to?
        return List(cat, page);
    }

    private ViewResult List(Category category, int page = 1) { //this code works }
}

[Table(Name = "products")]
public class Product
{
    [HiddenInput(DisplayValue = false)]
    [Column(Name = "id", IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)]
    public int ProductID { get; set; }

    [Column]
    public string Name { get; set; }

    [Column(Name = "info")]
    public string Description { get; set; }

    public float LowestPrice 
    {
        get { return (from product in ProductSubs select product.Price).Min(); }
    }

    private EntitySet<Category> _Categories = new EntitySet<Category>();
    [System.Data.Linq.Mapping.Association(Storage = "_Categories", OtherKey = "CategoryID")]
    public ICollection<Category> Categories
    {
        get { return _Categories; }
        set { _Categories.Assign(value); }
    }
}

[Table(Name = "products_types")]
public class Category
{
    [HiddenInput(DisplayValue = false)]
    [Column(Name = "id", IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)]
    public int CategoryID { get; set; }

    [Column(Name = "id")] // Temp solution, real name is localized in a separate table
    public string Name { get; set; }

    private EntitySet<Product> _Products = new EntitySet<Product>();
    [System.Data.Linq.Mapping.Association(Storage = "_Products", OtherKey = "ProductID")]
    public ICollection<Product> Products
    {
        get { return _Products; }
        set { _Products.Assign(value); }
    }
}

編集:

代わりにICategoriesRepositoryを使用して実行しようとしましたが、同じエラーが発生します。これは完全なスタックトレースです。

[InvalidCastException:指定されたキャストは無効です。] System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query、QueryInfo queryInfo、IObjectReaderFactory factory、Object [] parentArgs、Object [] userArgs、ICompiledSubQuery [] subQueries、Object lastResult)+ 1191 System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query、QueryInfo [] queryInfos、IObjectReaderFactory factory、Object [] userArguments、ICompiledSubQuery [] subQueries)+118System.Data.Linq.SqlClient.SqlProvider.System.Data。 Linq.Provider.IProvider.Execute(Expression query)+342 System.Data.Linq.Table 1.System.Linq.IQueryProvider.Execute(Expression expression) +58 System.Linq.Queryable.First(IQueryable1 source、Expression 1 predicate) +287 MaxFPS.WebUI.Controllers.ProductsController.ListById(Int32 categoryId, Int32 page) in d:\Filer\Documents\Dropbox\ZkilfinG\webbutveckling\MaxFPS\VS Projects\MaxFPS\MaxFPS\Controllers\ProductsController.cs:26 lambda_method(Closure , ControllerBase , Object[] ) +140 System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +14 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary2 parameters)+182 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext、ActionDescriptor actionDescriptor、IDictionary2 parameters) +27 System.Web.Mvc.Async.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41() +28 System.Web.Mvc.Async.<>c__DisplayClass81.b__7(IAsyncResult _)+10 System.Web.Mvc.Async.WrappedAsyncResult 1.End() +50 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +32 System.Web.Mvc.Async.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33() +58 System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +225 System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult) +10 System.Web.Mvc.Async.WrappedAsyncResult1.End()+50 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult)+34System.Web.Mvc.Async。 <> c__DisplayClass2a.b__20()+24System.Web.Mvc.Async。<>c__DisplayClass25.b__22(IAsyncResult asyncResult)+99 System.Web.Mvc.Async.WrappedAsyncResult 1.End() +50 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27 System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +14 System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23 System.Web.Mvc.Async.WrappedAsyncResult1.End()+55System.Web.Mvc。 Controller.EndExecuteCore(IAsyncResult asyncResult)+39System.Web.Mvc.Async。<>c__DisplayClass4.b__3(IAsyncResult ar)+23 System.Web.Mvc.Async.WrappedAsyncResult1.End() +55 System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +29 System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10 System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +25 System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23 System.Web.Mvc.Async.WrappedAsyncResult1.End()+55 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)+31 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)+9 System.Web.CallHandlerExecutionStep.System .Web.HttpApplication.IExecutionStep.Execute()+9629708 System.Web.HttpApplication.ExecuteStep(IExecutionStep step、Boolean&completedSynchronously)+155

編集:

categoryIdがデータベースにないIDに設定されている場合、空のシーケンスを取得します。これは、比較コードが正しいことを示していますが、無効なキャストが何であるか、または何であるかがわかりません。

[InvalidOperationException:シーケンスに要素が含まれていません] System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query、QueryInfo queryInfo、IObjectReaderFactory factory、Object [] parentArgs、Object [] userArgs、ICompiledSubQuery [] subQueries、Object lastResult)+1191システム.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query、QueryInfo [] queryInfos、IObjectReaderFactory factory、Object [] userArguments、ICompiledSubQuery [] subQueries)+118System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq。 Provider.IProvider.Execute(Expression query)+342 System.Data.Linq.Table 1.System.Linq.IQueryProvider.Execute(Expression expression) +58 System.Linq.Queryable.First(IQueryable1 source、Expression 1 predicate) +287 MaxFPS.WebUI.Controllers.ProductsController.ListById(Int32 categoryId, Int32 page) in d:\Filer\Documents\Dropbox\ZkilfinG\webbutveckling\MaxFPS\VS Projects\MaxFPS\MaxFPS\Controllers\ProductsController.cs:28 lambda_method(Closure , ControllerBase , Object[] ) +140 System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +14 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary2 parameters)+182 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext、ActionDescriptor actionDescriptor、IDictionary2 parameters) +27 System.Web.Mvc.Async.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41() +28 System.Web.Mvc.Async.<>c__DisplayClass81.b__7(IAsyncResult _)+10 System.Web.Mvc.Async.WrappedAsyncResult 1.End() +50 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +32 System.Web.Mvc.Async.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33() +58 System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +225 System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult) +10 System.Web.Mvc.Async.WrappedAsyncResult1.End()+50 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult)+34System.Web.Mvc.Async。 <> c__DisplayClass2a.b__20()+24System.Web.Mvc.Async。<>c__DisplayClass25.b__22(IAsyncResult asyncResult)+99 System.Web.Mvc.Async.WrappedAsyncResult 1.End() +50 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27 System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +14 System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23 System.Web.Mvc.Async.WrappedAsyncResult1.End()+55System.Web.Mvc。 Controller.EndExecuteCore(IAsyncResult asyncResult)+39System.Web.Mvc.Async。<>c__DisplayClass4.b__3(IAsyncResult ar)+23 System.Web.Mvc.Async.WrappedAsyncResult1.End() +55 System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +29 System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10 System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +25 System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23 System.Web.Mvc.Async.WrappedAsyncResult1.End()+55 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)+31 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)+9 System.Web.CallHandlerExecutionStep.System .Web.HttpApplication.IExecutionStep.Execute()+9629708 System.Web.HttpApplication.ExecuteStep(IExecutionStep step、Boolean&completedSynchronously

4

1 に答える 1

0

私がそれを理解したら、エラーは単純でした。私の実際のデータベースには、ローカライズされたカテゴリ名を取得するためのLocalizedCategoryがあります。実装するとき、私は物事を単純化するためにそれを使用することをスキップできると思いました。そこで、このコードを使用してNameに値を指定しました。

    [Column(Name = "id")]
    public string Name { get; set; }

ただし、idはデータベース内のintであるため、例外が発生しました。LocalizedCategoryですぐに機能するようにしようとしていますが、別の問題が発生しています。どのようにLINQするかによって、EntitySetから異なる値を取得するのはなぜですか。

于 2012-09-24T13:33:39.140 に答える