1

条件によってデータベースから行を取得しているときに、linq2sql に問題があります。C select n rows from table1 where table2 doesn't contain any rows by condition table1.id != table2.accId and table1.action != "action_constant"# に次のようなコードがあります。

query = (from accsArray in db.Accs
         where accsArray.Valid == 1 &&
               !String.IsNullOrEmpty(accsArray.Password) && 
               accsArray.vip_rec == 0 || accsArray.data_col == null &&
               !db.Reaktors.Any(rk => rk.Action == action &&
                                      rk.Account_id == accsArray.id)

         select new DbAcc
         {
             id = accsArray.id,
             Login = accsArray.Login,
             Password = accsArray.Password,
             System = accsArray.System,
             //FriendsCount = Convert.ToInt32(accsArray.Friends_count)
         }).Take(count).OrderBy(acc => acc.id);

!db.Reaktors.Any(rk => rk.Action == action && rk.Account_id == accsArray.id)これは機能しません。クリーンな SQL コードを探しているときに、次のように表示されます。

SELECT [t2].[id], [t2].[Login], [t2].[System], [t2].[Password]
FROM (SELECT TOP (50) [t0].[id], [t0].[Login], [t0].[System], [t0].[Password]
      FROM [Collider].[dbo].[Accs] AS [t0]
      WHERE (([t0].[Valid] = 1)
             AND ([t0].[Password] <> '')
             AND ([t0].[Login] <> '')
             AND ([t0].[data_col] = 0))
         OR (([t0].[data_col] IS NULL)
             AND (NOT (EXISTS(SELECT NULL AS [EMPTY]
                              FROM [dbo].[Reaktor] AS [t1]
                              WHERE [t1].[Actionself] = '_take_acc_dc'
                                AND ([t1].[Account_id] = [t0].[id])))))) AS [t2]
ORDER BY [t2].[id]

SELECT NULL AS [EMPTY] FROM [dbo].[Reaktor]特に怖いNULL AS [EMPTY]ので、正しく動作しないと思います。

4

1 に答える 1

2

解決策は、括弧を正しく配置し、条件を並べることです。正常に動作するコードは次のようになります。

query = (from accsArray in db.Accs
         where !db.Reaktors.Any(rk => (rk.Actionself == action 
                                       && rk.Account_id == accsArray.id)) 
               && accsArray.Valid == 1 
               && accsArray.Password != String.Empty 
               && accsArray.Login != String.Empty 
               && accsArray.data_col == 0
         select new DbAcc
         {
             id = accsArray.id,
             Login = accsArray.Login,
             Password = accsArray.Password,
             System = accsArray.System,
         }).Take(count).OrderBy(acc => acc.id);
于 2013-03-05T00:50:59.923 に答える