1

我目前有一个 linq 查询,我在同一个 MVC 类中使用了大约 5 次,是否可以public const像 astring或 an一样在页面内的某处定义查询int,而不必创建调用 linq 查询的方法?

IE

const LinqQuery myQuery = from cat in db.Categories where cat.CategoryID != null select cat;

...

public ActionResult Edit(long id = 0)
{
    ViewBag.ParentCategoryID = myQuery;
    ...
}

public ActionResult Create()
{
    ViewBag.ParentCategoryID = myQuery;
    ...
}

据我所知,唯一的方法是创建一个方法,但如果有更好的做事方式,我想避免它。

4

4 回答 4

2

我的水晶球告诉我,Linq 查询仅在您迭代结果时才会执行,因此:

static List<int> list = new List<int> { 1, 2, 3 };
static IEnumerable<int> result = from i in list where i > 2 select i;

static void Main(string[] args)
{
    Console.WriteLine(result.Sum()); // 3
    list.Add(5);
    Console.WriteLine(result.Sum()); // 8
}
于 2013-08-15T19:32:34.117 回答
1

MSDN 有一篇关于预编译查询的文章:

http://msdn.microsoft.com/en-us/library/bb399335.aspx

在您的示例中,它可能看起来像这样:

public static readonly Func<MyContext, int, IQueryable<Category>>
    myQuery = CompiledQuery.Compile((MyContext db, int categoryID) =>
            from cat in db.Categories where cat.CategoryID == categoryID select cat);

我补充说readonly,因为它将是最接近常数的值。

于 2013-08-15T19:42:43.697 回答
0

你很幸运,排序,虽然它很相似,但你可以声明一个Func<>并调用它。当您只有一个非常简单的指令要执行时,它看起来比方法更干净/更好。

这是他们实现的一个示例(这是来自我必须多次使用 SetWindowPos 以及其他一些东西的项目):

Func<Process, winPosData, bool> swp = (p, w) => SetWindowPos(p.MainWindowHandle, (IntPtr)w.hWndInsertAfter, w.x, w.y, w.cx, w.cy, w.uFlags);
于 2013-08-15T19:32:03.977 回答
0

是的,只要把它放在构造函数中(我假设的类型db.CatagoriesCatagory

public class ClassName
{
    public ClassName()
    {
        db =  //do whatever is needed to initialize the db context
        myQuery = from cat in db.Categories where cat.CategoryID != null select cat;
    }

    DataSourceContext db;
    IQueryable<Catagory> myQuery;

    public ActionResult Edit(long id = 0)
    {
        ViewBag.ParentCategoryID = myQuery;
        ...
    }

    public ActionResult Create()
    {
        ViewBag.ParentCategoryID = myQuery;
        ...
    }
}

db如果访问是以线程安全的方式完成的(通过内部内部DataSourceContext或您在防御性编码中),这也可以在具有静态成员的静态构造函数中完成


然而,更好的方法是调用一个静态函数,该函数返回您想要的查询并在您想要连接的数据库的上下文中传递。

public static IQueryable<Catagory> NonNullCatagoriesQuery(DataSourceContext db)
{
    return from cat in db.Categories where cat.CategoryID != null select cat;
}

然后在你的代码中你只是做

public ActionResult Edit(long id = 0)
{
    ViewBag.ParentCategoryID = NonNullCatagoriesQuery(db);
    ...
}

public ActionResult Create()
{
    ViewBag.ParentCategoryID = NonNullCatagoriesQuery(db);
    ...
}

您也可以将该函数移入包含 db 上下文的存储库类中,这样您就不需要将其传递进去,但您没有在代码示例中包含您是如何获得db.

于 2013-08-15T19:30:07.140 回答