1

テーブルとビューのクラスから MVC 4 のデータを取得するために linq を使用しています。次のように、ビューからデータを抽出するために linq を使用する場合:

db.vwContractMVC.Where(x => x.NID == id && x.Date >= pin && x.Date <= pen).ToList();

次に、linq は次のようにサブクエリを使用して SQL クエリを作成します。

SELECT 
[Extent1].[NID] AS [NID], 
[Extent1].[Date] AS [Date], 
[Extent1].[Column1] AS [Column1], 
[Extent1].[Column2] AS [Column2], 
[Extent1].[Column3] AS [Column3]
FROM (SELECT 
      [vwContractMVC].[NID] AS [NID], 
      [vwContractMVC].[Date] AS [Date], 
      [vwContractMVC].[Column1] AS [Column1], 
      [vwContractMVC].[Column2] AS [Column2], 
      [vwContractMVC].[Column3] AS [Column3]
      FROM [dbo].[vwContractMVC] AS [vwContractMVC]) AS [Extent1]
WHERE ([Extent1].[NID] = @p__linq__0) AND ([Extent1].[Date] >= @p__linq__1) AND ([Extent1].[Date] <= @p__linq__2)

テーブルが使用されている場合 - クエリは簡単です:

SELECT 
[Extent1].[NID] AS [NID], 
[Extent1].[Date] AS [Date], 
[Extent1].[Column1] AS [Column1], 
[Extent1].[Column2] AS [Column2], 
[Extent1].[Column3] AS [Column3]
FROM [dbo].[Contract] AS [Extent1]
WHERE ([Extent1].[NID] = @p__linq__0) AND ([Extent1].[Date] >= @p__linq__1) AND ([Extent1].[Date] <= @p__linq__2)

質問は - 可能な場合はもちろん、linq make simple select from view を取得する方法です)

そのためのストアド プロシージャを作成できますが、既存のテーブルとビューを使用したいと考えていました。

4

1 に答える 1

1

ビューから選択しているため、実際のSQLはサブクエリで作成されています。同じビューから複数回選択しない場合は、実際のテーブルから linq クエリを作成するだけです。それ以外の場合は、ビュー sql AsQueryable() を返すメソッドを作成し、必要に応じて where 句を追加できます。

コード:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace LinqToView
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (var context = new NWEntities())
                {
                    ViewQuery(context).Where(vw => vw.Product == "Foo").ToList();
                }
            }

            private static IQueryable<vwProducts_by_Categories> ViewQuery(NWEntities context)
            {
                return
                    from p in context.Products
                    join c in context.Categories on p.CategoryID equals c.CategoryID
                    select new vwProducts_by_Categories { Product = p.ProductName, Category = c.CategoryName };
            }
        }

        public class vwProducts_by_Categories
        {
            public string Product { get; set; }
            public string Category { get; set; }
        }
    }

これは以下を生成します:

    SELECT 
    [Extent2].[CategoryID] AS [CategoryID], 
    [Extent1].[ProductName] AS [ProductName], 
    [Extent2].[CategoryName] AS [CategoryName]
    FROM  [dbo].[Products] AS [Extent1]
    INNER JOIN [dbo].[Categories] AS [Extent2] ON [Extent1].[CategoryID] = [Extent2].[CategoryID]
    WHERE N'Foo' = [Extent1].[ProductName]
于 2012-11-13T22:17:48.187 に答える