0

データベースに3つのテーブルがあります。会社、製品、リード。以下は私の分野です。

リードテーブル:

SELECT [Id]
      ,[BuySellTypeId]
      ,[ProductName]
      ,[Keywords]
      ,[CategoryId] // categoryid
      ,[SubCategoryId]
      ,[Description]
      ,[ProductImagePath]
      ,[CreationDate]
      ,[ExpiryDate]
      ,[CompanyId] // company id
      ,[ShortDescription]
      ,[IsExpired]
      ,[IsActive]
  FROM [BuySell]

製品表:

SELECT   
        Id, 
        Name, 
        Description, 
        ImagePath, 
        CompanyId, //company id
        Keywords, 
        CategoryId,  // categoryid
        SubCategoryId, 
        PostedDate, 
        ExpiryDate, 
        ShortDescription, 
        IsActive,                       
        IsExpired
FROM  Products

上記の2つの表に参照が示されているテーブル「Company 」がもう1つあります。私の要件は、上記の表に存在するすべての会社、Products、BuySellを同じカテゴリにまとめることです。たとえば、CategoryId = 15のすべての会社を表示したい場合は、categoryid=15のすべての会社をbuysellおよびproductsテーブルから取得します。明らかに冗長性があるので、私はDistinct()個別のアイテムを抽出するために使用します。

私のLinq2SqlBizレイヤーメソッド

        /// <summary>
        /// Returns all companies by category id that exists in Lead and Products
        ///table
        /// </summary>
        /// <param name="categoryId">category id as integer</param>
        /// <param name="take">records to take</param>
        /// <param name="skip">records to skip</param>
        /// <returns>List of companies</returns>
        public static IList GetCompaniesByCategory(int categoryId, int take, int skip)
        {
            return (from c in Context.Companies
                   join bs in Context.BuySells on c.CompanyId equals bs.CompanyId
                   join p in Context.Products on c.CompanyId equals p.CompanyId
                   where bs.CategoryId == categoryId || p.CategoryId==categoryId
                   select new
                              {
                                  c.CompanyId,
                                  c.CompanyName,
                                  c.Country.Flag,
                                  c.Profile,
                                  c.IsUsingSMSNotifications,
                                  c.IsVerified,
                                  c.MembershipType,
                                  c.RegistrationDate, c.ShortProfile,
                              }).Skip(skip).Take(take).Distinct().ToList();
        }

しかし、上記のコードは私に0アイテムを返します。私がそのSQLを設計するとき、以下を参照してください、

SELECT     dbo.Company.CompanyId, dbo.Company.CompanyName, dbo.Company.Name, dbo.Company.IsVerified, dbo.Company.IsUsingSMSNotifications, 
                      dbo.Company.CompanyLogo, dbo.Company.RegistrationDate, dbo.Company.Profile
FROM         dbo.BuySell INNER JOIN
                      dbo.Company ON dbo.BuySell.CompanyId = dbo.Company.CompanyId LEFT OUTER JOIN
                      dbo.Products ON dbo.Company.CompanyId = dbo.Products.CompanyId
WHERE     (dbo.BuySell.CategoryId = 1) AND (dbo.Products.CategoryId = 1)

BuySellから会社を取得することはできますが、Productからは取得できません。だから私を助けてください。I need the LINQ equivalent statement. To replace the above cs code.

4

1 に答える 1

0

これらのテーブル間に何らかの関係がある場合、クエリははるかに単純になる可能性があります

return (from c in Context.Companies
where c.BuySells.Any( b=>b.CategoryId == categoryId)
      || c.Products.Any( p=>p.CategoryId == categoryId)
select new
{
  c.CompanyId,
  c.CompanyName,
  c.Country.Flag,
  c.Profile,
  c.IsUsingSMSNotifications,
  c.IsVerified,
  c.MembershipType,
  c.RegistrationDate, c.ShortProfile,
}).Skip(skip).Take(take).ToList();

SSMSで使用されるクエリはCategoryId=1をチェックし、AND条件を使用しますが、LINQクエリはOR条件を使用します

于 2012-04-13T11:25:41.747 に答える