【问题标题】:Asp.net MVC Lambda Syntax Basic of Joining and Contains加入和包含的 Asp.net MVC Lambda 语法基础
【发布时间】:2017-09-10 09:08:47
【问题描述】:

我有两张桌子

产品

CREATE TABLE [dbo].[product] 
(
    [Id]       INT           IDENTITY (1, 1) NOT NULL,
    [p_name]   VARCHAR (50)  NOT NULL,
    [p_desc]   VARCHAR (250) NULL,
    [p_price]  VARCHAR (50)  NOT NULL,
    [p_colour] VARCHAR (70)  NULL,
    [p_cover]  VARCHAR (50)  NOT NULL,
    [p_front]  VARCHAR (50)  NOT NULL,
    [p_back]   VARCHAR (50)  NULL,
    [p_add1]   VARCHAR (50)  NULL,
    [p_add2]   VARCHAR (50)  NULL,
    [p_cat]    INT           NOT NULL,

    PRIMARY KEY CLUSTERED ([Id] ASC),

    CONSTRAINT [FK_product_catagory] 
        FOREIGN KEY ([p_cat]) REFERENCES [dbo].[catagory] ([Id])
)

分类

CREATE TABLE [dbo].[Catagory] 
(
    [Id]       INT          IDENTITY (1, 1) NOT NULL,
    [cat_name] VARCHAR (50) NOT NULL,

    PRIMARY KEY CLUSTERED ([Id] ASC)
)

使用以下示例数据:

Product:

Catagory:

我想创建一个动作方法

public ActionResult ViewProducts(string Key)// contains category name
{
    var product = db.products.where(p => p.p_cat.contains(key));
    return View(product);
}

此方法应返回 category 等于 key 的所有产品。例如,所有产品都属于衬衫类别。

我知道如何在 SQL 中执行此操作,但 lambda 语法对我来说是新的。

请帮忙,谢谢

这是我的模型 Click to view model

edo

【问题讨论】:

  • 错字警告:这是“猫e血腥”(不是“分类”)

标签: sql-server entity-framework linq join filter


【解决方案1】:

var product = db.products.where(p => p.Categories.cat_name == key);

成员的名称可能会有所不同,具体取决于 EF 如何对您的表进行反向工程名称。

【讨论】:

  • 产品包含目录ID,目录名称在目录表中。
  • 请再次查看表格。谢谢
  • @Zeeshanhack 忘记 SQL 并学习使用 EF 导航属性(我相信这个答案暗示了 - product 表相关 除了p_cat FK 属性之外,还应该有一个指向category class导航属性。只需找到导航属性的调用方式并使用该名称而不是@987654325 @)。
  • @Zeeshanhack,如果您发布 Product 类会更好 - 确切地说,它是如何由 EF 生成的。
【解决方案2】:

能否加入 Product(p_cat) 和 Category(Id) 并使用 Cateroty 过滤掉记录?

public ActionResult ViewProducts(string Key)// contains category name
    {
        var product = db.products
            .Join(db.categoryies, 
                p => p.p_cat,
                c => c.Id,
                (p,c) => new { Product = p, Category = c })
            .Where(x => x.Category.cat_name.Contains(key)).ToList();
        return View(product);
    }

【讨论】:

  • 无法声明局部变量c。
  • 对不起它的“类别”而不是类别。你能再回答我一次吗
  • 但我只想要产品你能重新编写查询吗谢谢
  • 我的更改,var product = db.products .Join(db.catagories, p => p.p_cat, c => c.Id, (p, c) => new { product = p , 类别 = c }) .Where(x => x.catagory.cat_name.Contains(key)).ToList();我只想查询返回产品
  • 嗨 Zeeshan..只需在 .Where(x => x.Category.cat_name.Contains(key)) 之后添加 .Select(x => x.Product)。
【解决方案3】:

请使用以下选项更改您的 Linq 查询。

var product = (from p in db.products
                join c in db.categoryies ON p.p_cat equals  c.Id
                 where c.cat_name.Contains(key)
                select p).ToList();

注意:实体名称可能因您的 EF 实体名称而异。

【讨论】:

  • @Zeeshanhack 好的。如果它对你有用,请标记答案。
猜你喜欢
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 1970-01-01
  • 2014-10-14
相关资源
最近更新 更多